#include"tools.h"
#include<QRegularExpressionMatch> //qt6用这个
//#include<QRegExp> //qt5用这个
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
bool usernameIsTrue(const QString &username)
{
    //qt5用这个
    //用户名是否为空
    //if (username.isEmpty()) {
    //    return false;
    //}
    // 检查用户名长度是否超过 20 个字符
    //if (username.length() > 20) {
    //    return false;
    //}
    // 正则表达式：字母、数字、下划线、点
    //QRegExp usernameRegex("^[a-zA-Z0-9_\\.]+$");
    // 检查用户名是否符合正则表达式
    //return usernameRegex.exactMatch(username);

    //qt6用这个
    // 检查用户名是否为空
    if (username.isEmpty()) {
        return false;
    }

    // 检查用户名长度是否超过 20 个字符
    if (username.length() > 20) {
        return false;
    }

    // 正则表达式：字母、数字、下划线、点
    QRegularExpression usernameRegex("^[a-zA-Z0-9_\\.]+$");

    // 检查用户名是否符合正则表达式
    QRegularExpressionMatch match = usernameRegex.match(username);
    return match.hasMatch();  // 如果有匹配项，返回 true
}

bool passwordIsTrue(const QString &password)
{
    //qt5用这个
    // 检查密码是否为空
    //if (password.isEmpty()) {
    //    return false;
    //}

    // 正则表达式：字母、数字、下划线、特殊字符，且长度为 8 到 20 位
    //QRegExp passwordRegex("^[a-zA-Z0-9_!@#$%^&*()_-]{8,20}$");

    // 检查密码是否符合正则表达式
    //return passwordRegex.exactMatch(password);

    //qt6用这个
    // 检查密码是否为空
    if (password.isEmpty()) {
        return false;
    }

    // 正则表达式：字母、数字、下划线、特殊字符，且长度为 8 到 20 位
    QRegularExpression passwordRegex("^[a-zA-Z0-9_!@#$%^&*()_-]{8,20}$");

    // 检查密码是否符合正则表达式
    QRegularExpressionMatch match = passwordRegex.match(password);
    return match.hasMatch();  // 如果有匹配项，返回 true
}

bool phoneIsTrue(const QString &phoneNumber) {
    // 如果电话号码为空，视为有效
    if (phoneNumber.isEmpty()) {
        return true;
    }
    //QT5用这个
    // 使用正则表达式判断是否为11位数字
    //QRegExp regex("^\\d{11}$");
    //return regex.exactMatch(phoneNumber);  // exactMatch 完全匹配

    //QT6用这个
    // 使用 QRegularExpression 判断是否为11位数字
    QRegularExpression regex("^\\d{11}$");
    QRegularExpressionMatch match = regex.match(phoneNumber);

    return match.hasMatch();  // 如果有匹配，返回 true
}

void getUserByStream(QDataStream &in, User &user){
    int id;   //id
    QString username; //用户名
    QString password; //密码
    QString gender; //性别
    int age; //年龄
    QString phone; //电话号码
    QString state; //状态
    QString note; //个人说明

    in>>id>>username>>password>>gender>>age>>phone>>state>>note;

    user.setId(id);
    user.setUsername(username);
    user.setPassword(password);
    user.setGender(gender);
    user.setAge(age);
    user.setPhone(phone);
    user.setState(state);
    user.setNote(note);
}

void sendUserData(QTcpSocket* socket, const User& user) {
    if (!socket || !socket->isOpen()) {
        qWarning() << "Socket is not open!";
        return;
    }
    // 序列化用户数据
    QByteArray data;
    QDataStream out(&data, QIODevice::WriteOnly);
    out.setByteOrder(QDataStream::LittleEndian);

    // 将User对象的属性写入流中
    out << user.getId() << user.getUsername() << user.getPassword() <<user.getGender()<<user.getAge()<<user.getPhone()<<user.getState()<<user.getNote();

    // 发送数据
    socket->write(data);

    if (socket->waitForBytesWritten()) {
        qDebug() << "User data sent successfully.";
    } else {
        qWarning() << "Failed to send user data.";
    }
}

void getFriendByStream(QDataStream &in,Friend &frd){
    int id;          // 好友关系记录的id
    QString username1; // 主用户名
    QString username2; // 从属用户名
    in>>id>>username1>>username2;
    frd.setId(id);
    frd.setUsername1(username1);
    frd.setUsername2(username2);
}

void sendFriendData(QTcpSocket* socket, const Friend &frd){
    if (!socket || !socket->isOpen()) {
        qWarning() << "Socket is not open!";
        return;
    }
    // 序列化用户数据
    QByteArray data;
    QDataStream out(&data, QIODevice::WriteOnly);
    out.setByteOrder(QDataStream::LittleEndian);

    // 将User对象的属性写入流中
    out << frd.getId() << frd.getUsername1() << frd.getUsername2();

    // 发送数据
    socket->write(data);

    if (socket->waitForBytesWritten()) {
        qDebug() << "User data sent successfully.";
    } else {
        qWarning() << "Failed to send user data.";
    }
}

void sendDatabase(QTcpSocket* socket,quint8 packetType,quint8 operationType,quint8 tableType){
    if (!socket || !socket->isOpen()) {
        qWarning() << "Socket is not open!";
        return;
    }
    // 序列化数据包
    QByteArray data;
    QDataStream out(&data, QIODevice::WriteOnly);
    out.setByteOrder(QDataStream::LittleEndian);

    out<<packetType<<operationType<<tableType;

    // 发送数据
    socket->write(data);

    if (socket->waitForBytesWritten()) {
        qDebug() << "User data sent successfully.";
    } else {
        qWarning() << "Failed to send user data.";
    }
}

void sendChatdata(QTcpSocket* socket , quint8 packetType,quint8 dataType,int len){
    if (!socket || !socket->isOpen()) {
        qWarning() << "Socket is not open!";
        return;
    }
    // 序列化用户数据
    QByteArray data;
    QDataStream out(&data, QIODevice::WriteOnly);
    out.setByteOrder(QDataStream::LittleEndian);

    out<<packetType<<dataType<<len;

    // 发送数据
    socket->write(data);

    if (socket->waitForBytesWritten()) {
        qDebug() << "User data sent successfully.";
    } else {
        qWarning() << "Failed to send user data.";
    }
}

void waitForTimeout(int milliseconds) {
    QEventLoop loop;
    QTimer::singleShot(milliseconds, &loop, &QEventLoop::quit); // 指定时间后退出事件循环
    loop.exec();  // 等待直到事件循环退出
    qDebug() << "等待" << milliseconds << "毫秒后退出";
}


//刷新按钮
void shuaxin(QTcpSocket *socket,quint8 tableType,const QString &username,QStringList &usernames){
    sendDatabase(socket,Database,Select,tableType);
    QByteArray data;
    QDataStream out(&data, QIODevice::WriteOnly);
    out.setByteOrder(QDataStream::LittleEndian);
    out<<username;
    socket->write(data);
    //等待两秒
    waitForTimeout(1000);
    QByteArray data1;
    if (socket->bytesAvailable() > 0) {
        // 有数据可以读取
        data1 = socket->readAll();
        qDebug()<<"登录页面--读取到数据: "<<data1;
    }else{
        qDebug()<<"登录页面--没有数据";
    }

    QDataStream in(data1);
    in.setByteOrder(QDataStream::LittleEndian);
    in>>usernames;
}

